package cn.itcast;

/**
 * 反射的主要用途是设计框架的
 * 框架是半成品软件
 * 反射：将类的各个组成部分封装为其他对象
 *
 * 理解反射要先知道java运行的三个阶段
 * 1.源代码阶段(Source)
 *      就是一个java代码经过javac编译后的状态
 *      此时还未进入内存
 *      在IDEA中就是java代码已经写好了但没执行的时候的状态 -->因为保存的时候它就自动编译了  --> .class字节码文件
 *      字节码文件中由三部分：
 *              分别对应着java文件的成员方法 ， 成员变量 ，构造函数
 *      称为这种有字节码文件 ， 且一个java代码中的各个部分已经被存好了的地方为java源代码阶段
 * 2.Class类对象阶段
 *  .class中的文件各个部分已经准备好了 ， 但还没有加载进内存，也就 new 不了对象
 *  这里面涉及到一个对象 -->类加载器 ClassLoader 它可以把.class字节码文件加载到内存中 -->第二个阶段
 *  这阶段重点是知道内存中需要有个对象来描述这个文件中的对象        -->Class类
 *  这个类中由三部分：
 *      成员变量：Field []
 *      构造方法：Constructor []
 *      成员方法：Methods []
 *      这就是Class类
 *      将来可以通过Class类里的行为就可以拿到某个对象的这些属性
 *      比如通过这里的行为来创建真正的 new 对象
 * 注意：在这个阶段中无论 new 了几个实例对象
 *  内存中的这个Class对象只有一个
 *
 * 3.运行时阶段：(RunTime阶段)
 *      就是一个字节码文件.class中的对象被 new 出来了后的那个阶段 -->就是已经生成了java对象的阶段
 *      所有的 new 对象都是靠这个构建的
 *
 * 反射就是把这几个阶段封装成对象
 * 或者说把方法 ， 成员对象之类的封装成对象
 *
 * 好处：在程序的运行时操作对象 ， 解耦
 *      比如代码提示就是IDEA先把你写的代码加载进内存 ， 因为你一边写他以i按给你编译成 .class文件了
 *      然后因为Class对象中会把所有的methods方法抽取出来封装成methods对象数组
 *      所以我只要调用methods方法获取所有的对象就可以有代码提示了
 *
 * 操作对象显然是要先获取Class对象 ， 因为他那里面才加载了所有的属性
 * 获取Class的三个方法
 * 1.源代码阶段：-->调用类方法
 *      Class.forName(全类名)：将字节码文件加载进内存 ， 返回Class对象
 * 2.Class阶段：-->类名.class
 *      这时候已经加载进了内存 ， 不用再获取 ， 通过对象的class属性来获取
 * 3.运行时阶段：已经有对象了 -->对象名.getClass()
 *      这个方法是Object类中的
 */
public class App {

}
